# -*- coding: utf-8 -*-
# @Time     : 2021/11/27 12:39
# @Author   : wljess
# @File     : 上下文管理器.py
# @Describe : 
# @Software : PyCharm

class Context:

    def __init__(self, name, mode):
        self.name = name
        self.mode = mode
        # 文件句柄，资源对象
        self.file_handle = None

    def __enter__(self):
        # 进入上下文管理器的运行时上下文,获取资源
        print("__enter__")
        self.file_handle = open("info.txt", "w")
        return self.file_handle

    def __exit__(self, exc_type, exc_val, exc_tb):
        # 退出上下文管理器的运行时上下文，释放资源
        print("__exit__")
        self.file_handle.close()


with Context("info.log", 'w') as f:
    print("业务逻辑主体部分")
    f.write("hello world!!!")

'''
上下文管理器调用解析：
1. with语句先暂存Context类的__exit__方法，调用Context类的 __enter__ 方法 (进入上下文管理器的运行时上下文)。 
2. __enter__方法打开文件info.log文件并返回给with语句，而打开的文件句柄被传递给变量f。
3.执行with语句体/代码块，令f调用write()方法在文件info.log中写入"hello world!!!" 。
4.with语句调用先前暂存的__exit__方法 (退出上下文管理器的运行时上下文)，正常关闭文件info.log文件。
'''
